package org.nobject.common.lang;

import java.lang.reflect.Array;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Set;

import org.nobject.common.exception.ConvertException;
import org.nobject.common.js.JSONUtils;

/**
 * Set工具类
 *
 * @author bianrongjun
 * @version 1.0
 */
public class SetUtils {
	/******************************************************************************************************************
	 * 
	 *  toSet 区域
	 * 
	 *******************************************************************************************************************/
	
	/** 
	 * 数组转换为Set
	 * @param array 数组
	 */
	public static Set toSetByArray(Object array){
		Set s=new LinkedHashSet();
		int l=Array.getLength(array);
		for (int i = 0; i < l; i++) s.add(Array.get(array, i));
		return s;
	}
	
	/** 
	 * List转换为Set
	 * @param list LIST
	 * @throws ConvertException
	 */
	public static Set toSet(List list) throws ConvertException{
		Set s=new LinkedHashSet();
		for(Object o:list) s.add(o);
		return s;
	}
	
	/** 
	 * 字符串转换为Set,支持JSON格式的转换
	 * @param str
	 * @throws ConvertException
	 */
	public static Set toSet(String str) throws ConvertException{
		return toSet(JSONUtils.toList(str));
	}
	
	/** 
	 * 对象数组转换为Set
	 * @param objs 对象数组
	 * @throws ConvertException 转换异常
	 */
	public static Set toSet(Object[] objs) throws ConvertException{
		return toSet0(objs);
	}
	
	/** 
	 * 对象转换为Set
	 * @param obj
	 * @throws ConvertException 转换异常
	 */
	public static Set toSet0(Object obj) throws ConvertException{
		if(obj==null) return null;
		Class c=obj.getClass();
		if(ClassUtils.isSet(c)) return (Set)obj;
		if(c.isArray()){
			return toSetByArray(obj);
		}else if(ClassUtils.isString(c)){
			return toSet((String)obj);
		}else{
			throw new ConvertException("不支持到Set的转换:"+c.getName());
		}
	}
}
